home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / tip / list-mac.tip < prev    next >
Text File  |  1993-09-15  |  4KB  |  143 lines

  1. % This macro source file is from the four volume series
  2. % "TeX in Practice" by Stephan von Bechtolsheim, published
  3. % 1993 by Springer-Verlag, New York.
  4. % Copyright 1993 Stephan von Bechtolsheim.
  5. % No warranty or liability is assumed.
  6. % This macro may be copied freely if no fees other than
  7. % media cost or shipping charges are charged and as long
  8. % as this copyright and the following source code itself
  9. % is not changed. Please see the series for further information.
  10. %
  11. % Version: 1.0
  12. % Date: May 1, 1993
  13. %
  14. %
  15. % This source code is documented in 20.2.2, p. III-121.
  16. % Original source in file "tokens3.TEX", starting line 263.
  17. \wlog{L: "list-mac.tip" ["tokens3.TEX," l. 263, p. III-121]}%
  18. % This file DOES belong to format "texip."
  19. \InputD{compst.tip}
  20. \catcode`\@ = 11
  21. \def\@EmptyRefList{}
  22. \def\EmptyListConditional #1{%
  23.     TT\fi
  24.     \ifx#1\@EmptyRefList
  25. }
  26. \newtoks\@AppendTokOne
  27. \newtoks\@AppendTokTwo
  28. \def\LeftAppendElement #1#2{%
  29.     \edef\@AppendTemp{\noexpand\\{#2}}% 
  30.     \@AppendTokOne = \expandafter{\@AppendTemp}%
  31.     \@AppendTokTwo = \expandafter{#1}%
  32.     \edef#1{\the\@AppendTokOne \the\@AppendTokTwo}%
  33. }
  34. \def\RightAppendElement #1#2{%
  35.     \edef\@AppendTemp{\noexpand\\{#2}}% 
  36.     \@AppendTokOne = \expandafter{\@AppendTemp}%
  37.     \@AppendTokTwo = \expandafter{#1}%
  38.     \edef#1{\the\@AppendTokTwo \the\@AppendTokOne}%
  39. }
  40. \def\CarOfList #1#2{%
  41.     \def\@CarTemp \\##1##2\@EndCarList{\def#2{##1}}%
  42.     \expandafter\@CarTemp#1\@EndCarList
  43. }
  44. \def\CdrOfList #1#2{% 
  45.     \def\@CdrTemp \\##1##2\@EndCdrList{\def#2{##2}}% 
  46.     \expandafter\@CdrTemp#1\@EndCdrList
  47. }
  48. \def\DropFirstElementOfList #1{% 
  49.     \if\EmptyListConditional{#1}% 
  50.         \errhelp = {\string\DropFirstElementOfList: list is
  51.             empty. No first element to drop.}%
  52.         \errmessage{\string\DropFirstElementOfList: List
  53.             \noexpand#1 is empty.}%
  54.     \else
  55.         \def\@DropFirstElementTemp \\##1##2\@EndCdrList{\def#1{##2}}%
  56.         \expandafter\@DropFirstElementTemp#1\@EndCdrList
  57.     \fi
  58. }
  59. \def\CarCarOfList #1#2{%
  60.     \let\@CarCarOfListList = #1%
  61.     \DropFirstElementOfList{\@CarCarOfListList}%
  62.     \CarOfList{\@CarCarOfListList}{#2}
  63. }
  64. \def\ForEveryListElement #1#2{%
  65.     \let\@ForEveryList = #1%
  66.     \let\@ForEveryListElementMacro = #2%
  67.     \@ForEveryListElement
  68. }
  69. \def\@ForEveryListElement{%
  70.     \if\EmptyListConditional{\@ForEveryList}%
  71.         \let\@ForEveryListElementNext = \relax
  72.     \else
  73.         \CarOfList{\@ForEveryList}{\@ForEveryListElementElement}%
  74.         \@ForEveryListElementMacro{\@ForEveryListElementElement}%
  75.         \DropFirstElementOfList{\@ForEveryList}%
  76.         \let\@ForEveryListElementNext = \@ForEveryListElement
  77.     \fi
  78.     \@ForEveryListElementNext
  79. }
  80. \newif\if@MemberList
  81. \def\MemberOfListConditional #1#2{%
  82.     TT\fi
  83.     \@MemberListfalse
  84.     {%
  85.         \def\\##1{% 
  86.             \if\StringsEqualConditional{#2}{##1}% 
  87.                 \global\@MemberListtrue
  88.             \fi
  89.         }%
  90.         #1% 
  91.     }%
  92.     \if@MemberList
  93. }
  94. \def\ReverseList #1#2{%
  95.     \def\@ReverseListOut{}%
  96.     \ForEveryListElement{#1}{\@ReverseList}%
  97.     \let#2 = \@ReverseListOut
  98. }
  99. \def\@ReverseList #1{% 
  100.     \LeftAppendElement{\@ReverseListOut}{#1}%
  101. }
  102. \def\LastElementOfList #1#2{%
  103.     \ReverseList{#1}{#1}%
  104.     \CarOfList{#1}{#2}%
  105.     \ReverseList{#1}{#1}%
  106. }
  107. \def\DropLastElementOfList #1{%
  108.     \ReverseList{#1}{#1}%
  109.     \DropFirstElementOfList{#1}%
  110.     \ReverseList{#1}{#1}%
  111. }
  112. \def\NumberOfListElements #1#2{% 
  113.     \let\@NumberOfListElementsList = #1%
  114.     \def\@NumberOfListElementsCount{#2}%
  115.     \@NumberOfListElementsCount = 0
  116.     \@NumberOfListElements  
  117. }
  118. \def\@NumberOfListElements{%
  119.     \if\EmptyListConditional{\@NumberOfListElementsList}%
  120.         \let\@NumberOfListElementsNext = \relax
  121.     \else
  122.         \advance\@NumberOfListElementsCount by 1
  123.         \DropFirstElementOfList{\@NumberOfListElementsList}%
  124.         \let\@NumberOfListElementsNext = \@NumberOfListElements
  125.     \fi
  126.     \@NumberOfListElementsNext
  127. }
  128. \newcount\@NumberOfListElCCount
  129. \def\NumberOfListElementsNumConditional #1{%
  130.     0=0\fi
  131.     \NumberOfListElements{#1}{\@NumberOfListElCCount}%
  132.     \ifnum\@NumberOfListElCCount
  133. }
  134. \def\CombineTwoLists #1#2#3{%
  135.     \def\@CombineTwoLists{\def\@CombineTwoListsResult}%
  136.     \expandafter\expandafter\expandafter
  137.     \expandafter\expandafter\expandafter
  138.     \expandafter\@CombineTwoLists
  139.     \expandafter\expandafter\expandafter{\expandafter#1#2}%
  140.     \let #3 = \@CombineTwoListsResult
  141. }
  142. \catcode`\@ = 12
  143.